package com.zwh.se.design_pattern.creational.singleton;

/**
 * "单例模式"存在着多种方式。当前类中所介绍的是其中的一种，其他的方式均在该包中，请自行阅读。
 * <p>
 * 饿汉式: <p>
 * 优点：
 * 1、简单实用，推荐使用！
 * 2、没有加锁，执行效率较高(相对其他方式而言)。
 * 3、多线程安全(在类加载期间初始化静态实例，由JVM的classloader机制保证线程安全)
 * 4、类加载比较慢，但是获取实例对象比较快(相对其他方式而言)。
 * <p>
 * 缺点：
 * 1、容易产生垃圾对象(因为不管用到与否，类装载时就完成实例化。而所谓垃圾对象，就是实例化之后却一直不用，放着浪费内存）
 * 2、不支持延迟加载实例(懒加载)
 * <p>
 *
 * @author yexi
 */
public class Hungry {

    //保持该类在系统中有且只有一个实例，并私有化，只允许通过统一调用方式获取
    private static final Hungry INSTANCE = new Hungry();

    //上面的也可以这么写，这跟上面的那种本质上一模一样。
    private static final Hungry INSTANCE2;

    static {
        INSTANCE2 = new Hungry();
    }

    //私有化构造方法
    private Hungry() {
    }

    //对外界提供统一调用方法获取单例对象。
    public static Hungry getInstance() {
        return INSTANCE;
    }

    //当然其实对于"饿汉式"而言，没必要让实例对象私有化再提供方法调用，直接将单例对象设成public直接供予外界使用即可。
    public static final Hungry INSTANCE3 = new Hungry();

    public static void main(String[] args) {
        Hungry instance1 = Hungry.getInstance();
        Hungry instance2 = Hungry.getInstance();
        System.out.println(instance1 == instance2);
    }
}
